package com.mentalhealthplatform.utils;

import lombok.Getter;
import lombok.Setter;
import org.springframework.data.domain.Page;

import java.util.List;


@Setter
@Getter
public class PagedResponse<T> {
    private List<T> content;
    private int pageNumber;
    private int pageSize;
    private long totalElements;
    private int totalPages;
    private boolean last;

    /**
     * 构造函数，适用于直接从 Spring Data JPA 的 Page 对象创建 PagedResponse
     *
     * @param page Spring Data JPA 的 Page 对象，包含分页结果
     *
     * 使用场景：
     * 该构造函数适用于直接获取一个 `Page<T>` 对象（例如：`Page<Teacher>`），
     * 并希望通过该对象自动填充分页信息和内容列表的场景。
     * 比如在服务层从数据库查询数据时返回的分页数据，使用这个构造函数。
     */
    public PagedResponse(Page<T> page) {
        this.content = page.getContent();
        this.pageNumber = page.getNumber();
        this.pageSize = page.getSize();
        this.totalElements = page.getTotalElements();
        this.totalPages = page.getTotalPages();
        this.last = page.isLast();
    }

    /**
     * 构造函数，适用于手动传递分页信息和内容列表创建 PagedResponse
     *
     * @param content 当前页的内容列表
     * @param pageNumber 当前页码（从0开始）
     * @param pageSize 每页的条目数量
     * @param totalElements 总元素数量
     * @param totalPages 总页数
     * @param last 是否是最后一页
     *
     * 使用场景：
     * 如果你已经处理了分页和排序逻辑，并且手动计算了总页数、总元素数等分页信息，
     * 使用这个构造函数可以通过手动提供这些信息来创建 `PagedResponse` 对象。
     * 例如在自定义分页查询或使用 `Pageable` 对象时，手动构建分页响应的场景。
     */
    public PagedResponse(List<T> content, int pageNumber, int pageSize, long totalElements, int totalPages, boolean last) {
        this.content = content;
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        this.totalElements = totalElements;
        this.totalPages = totalPages;
        this.last = last;
    }
}
